package providers

import (
	"github.com/go-redis/redis"
	"strings"
	"time"
)

const cRedisHeartbeat = 60 // 单位：秒
var Redis *redis.Client

func init() {
	if !Config.GetBool("redis.isStart") {
		return
	}

	// 创建连接
	Redis = getRedisClient()

	// 连接验证
	checkRedisCon()

	// 心跳检测
	go redisHeartbeatRun()

}

/**
 * @Author: yang
 * @Description：返回redis客户端
 * @Date: 2021/10/18 19:36
 */
func getRedisClient() *redis.Client {
	redisConfig := Config.GetStringMap("redis")
	return redis.NewClient(&redis.Options{
		Addr:     redisConfig["host"].(string),
		Password: redisConfig["password"].(string), // no password set
		DB:       int(redisConfig["db"].(int64)),   // use default DB
	})
}

/**
 * @Author: yang
 * @Description：重置redis连接
 * @Date: 2021/10/18 19:39
 */
func resetRedis() {

	// 关闭连接
	if Redis != nil {
		Redis.Close()
	}

	// 创建连接
	Redis = getRedisClient()

	// 连接验证
	checkRedisCon()

}

/**
 * @Author: yang
 * @Description：redis连接检测
 * @Date: 2021/10/18 19:40
 */
func checkRedisCon() {
	if _, err := Redis.Ping().Result(); err != nil {
		Logger.Errorf("redis初始化失败：%s", err.Error())
	}
}

/**
 * @Author: yang
 * @Description：每分钟检测一次心跳
 * @Date: 2021/10/18 19:43
 */
func redisHeartbeatRun() {
	timer := time.NewTicker(cRedisHeartbeat * time.Second)
	for {
		select {
		case <-timer.C:
			if pong, err := Redis.Ping().Result(); err != nil || strings.ToLower(pong) != "pong" {
				resetRedis()
			}
		}
	}
}
